package com.pureut.system.service.impl;


import com.pureut.common.core.exception.GlobalException;
import com.pureut.common.core.utils.bean.BeanUtils;
import com.pureut.common.security.utils.DictUtils;
import com.pureut.common.security.utils.SecurityUtils;
import com.pureut.system.api.domain.SysDictData;
import com.pureut.system.domain.MaterialBomHalf;
import com.pureut.system.domain.dto.*;
import com.pureut.system.domain.vo.*;
import com.pureut.system.mapper.*;
import com.pureut.system.service.IMaterialBomHalfService;
import com.pureut.system.service.ISysDocumentService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @author: CM
 * @date: 2023/6/13  10:12
 */
@Service
public class MaterialBomHalfServiceImpl implements IMaterialBomHalfService {

    @Resource
    MaterialBomHalfMapper materialBomHalfMapper;

    @Resource
    MaterialBomHalfDetailMapper materialBomHalfDetailMapper;

    @Resource
    MaterialFinishedMapper materialFinishedMapper;

    @Resource
    MaterialHalfMapper materialHalfMapper;

    @Resource
    MaterialAwmateriaMapper materialAwmateriaMapper;

    @Resource
    MaterialAccessoriesMapper materialAccessoriesMapper;

    @Resource
    ISysDocumentService sysDocumentService;

    /**
     * 查询Bom列表
     *
     * @param materialBomVo
     * @return
     */
    @Override
    public List<MaterialBomHalfDto> selectBomList(MaterialBomVo materialBomVo) {
        List<MaterialBomHalfDto> list = materialBomHalfMapper.selectBomList(materialBomVo);

        for (MaterialBomHalfDto materialBomDto : list) {

            String bomType = materialBomDto.getBomType();

            List<SysDictData> netArray = DictUtils.getDictCache("sys_material_unit");
            Map<String, String> netMap = netArray.stream().collect(Collectors.toMap(SysDictData::getDictValue, SysDictData::getDictLabel));

            //半成品
            if ("3".equals(bomType)) {

                MaterialHalfVo materialHalf = new MaterialHalfVo();
                MaterialHalfDto materialHalfDto = new MaterialHalfDto();
                materialHalf.setMaterialId(materialBomDto.getMaterialId());
                List<MaterialHalfDto> haList = materialHalfMapper.selectHalfList(materialHalf);
                materialHalfDto = haList.get(0);
                materialBomDto.setMaterialCode(materialHalfDto.getMaterialCode());
                materialBomDto.setMaterialName(materialHalfDto.getMaterialName());
                materialBomDto.setMaterialSpec(materialHalfDto.getMaterialSpec());
                materialBomDto.setMaterialTypeName(materialHalfDto.getMaterialCategory());
                materialBomDto.setMaterialUnit(netMap.get(materialHalfDto.getMaterialUnit()));
                materialBomDto.setBomType("半成品");
            } else if ("4".equals(bomType)) {
                //成品
                MaterialFinishedVo materialFinished = new MaterialFinishedVo();
                materialFinished.setMaterialId(materialBomDto.getMaterialId());
                List<MaterialFinishedDto> mfDto = materialFinishedMapper.selectFinishedList(materialFinished);
                MaterialFinishedDto materialFinishedDto = mfDto.get(0);
                materialBomDto.setMaterialCode(materialFinishedDto.getMaterialCode());
                materialBomDto.setMaterialName(materialFinishedDto.getMaterialName());
                materialBomDto.setMaterialSpec(materialFinishedDto.getMaterialSpec());
                materialBomDto.setMaterialTypeName(materialFinishedDto.getMaterialTypeName());
                materialBomDto.setMaterialUnit(netMap.get(materialFinishedDto.getMaterialUnit()));
                materialBomDto.setBomType("成品");
            } else if ("1".equals(bomType)) {
                //原料
                MaterialAwmateriaDto materialAwmateriaDto = materialAwmateriaMapper.selectAwmateriaById(materialBomDto.getMaterialId());
                materialBomDto.setMaterialCode(materialAwmateriaDto.getMaterialCode());
                materialBomDto.setMaterialName(materialAwmateriaDto.getMaterialName());
                materialBomDto.setMaterialSpec(materialAwmateriaDto.getMaterialSpec());
                materialBomDto.setMaterialTypeName(materialAwmateriaDto.getMaterialCategory());
                materialBomDto.setMaterialUnit(netMap.get(materialAwmateriaDto.getMaterialUnit()));
                materialBomDto.setBomType("原料");
            } else {
                //辅料
                MaterialAccessoriesVo materialAccessories = new MaterialAccessoriesVo();
                materialAccessories.setMaterialId(materialBomDto.getMaterialId());
                List<MaterialAwmateriaDto> maList = materialAccessoriesMapper.selectAccessoriesList(materialAccessories);
                MaterialAwmateriaDto materialAwmateriaDto = maList.get(0);
                materialBomDto.setMaterialCode(materialAwmateriaDto.getMaterialCode());
                materialBomDto.setMaterialName(materialAwmateriaDto.getMaterialName());
                materialBomDto.setMaterialSpec(materialAwmateriaDto.getMaterialSpec());
                materialBomDto.setMaterialTypeName(materialAwmateriaDto.getMaterialCategory());
                materialBomDto.setMaterialUnit(netMap.get(materialAwmateriaDto.getMaterialUnit()));
                materialBomDto.setBomType("辅料");
            }
        }

        return list;
    }

    /**
     * 新增半成品Bom
     *
     * @param materialNewBomAddVo
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean insertBom(MaterialNewBomAddVo materialNewBomAddVo) throws Exception {

        //查询当前bom的物料编码是否只有一个默认
        long Markcount = materialBomHalfMapper.selectDefault(materialNewBomAddVo.getMaterialCode());
        //如果大于等于1，那么如果vo中的默认标识为1，则提示一个成品，半成品只存在一条BOM
        if (Markcount>=1 && materialNewBomAddVo.getBomMark()==1){
            throw new GlobalException("一个成品,半成品只能存在一条默认BOM");
        }


        //新增判断明细是否相同校验

        //通过产品编码查出是否存在此bom
        MaterialBomHalf materialBomHalf1 = new MaterialBomHalf();
        materialBomHalf1.setMaterialCode(materialNewBomAddVo.getMaterialCode());
        List<MaterialBomHalfDto> materialBomHalfDtos = materialBomHalfMapper.selectCopyBomList(materialBomHalf1);

        //如果存在该物料编码的BOM则触发校验
        if (materialBomHalfDtos.size()>0){

            for (MaterialBomHalfDto materialBomHalfDto : materialBomHalfDtos) {

                //二级列表
                List<MaterialBomHalfDetailDto> twoList = materialBomHalfDetailMapper.getByParentId(materialBomHalfDto.getBomId());

                if (twoList.size()==materialNewBomAddVo.getList().size()) {

                    int count =0;

                    for (MaterialBomHalfDetailDto materialBomHalfDetailDto : twoList) {

                        //新增明细集合
                        for (MaterialNewBomAddListVo materialNewBomAddListVo : materialNewBomAddVo.getList()) {
                            if (materialBomHalfDetailDto.getMaterialCode().equals(materialNewBomAddListVo.getMaterialCode()) && materialBomHalfDetailDto.getBomProportion().equals(materialNewBomAddListVo.getBomProportion())) {
                                count++;
                            }
                        }

                    }

                    if (count==materialNewBomAddVo.getList().size()){
                        throw new GlobalException("系统BOM已经存在");
                    }
                }

            }


        }





        String coding = sysDocumentService.selectAuthorityCoding("material:bom:list");

        //半成品新增
        MaterialBomHalf materialBomHalf = new MaterialBomHalf();
        //雪花id
        int i1 = new Random().nextInt(100);

        Date d = new Date();

        SimpleDateFormat sbf = new SimpleDateFormat("yyyyMMddHHmmss");
        Long uuid = Long.parseLong(sbf.format(d)+i1);
        materialBomHalf.setBomId(uuid);

        //类别
        materialBomHalf.setBomType(materialNewBomAddVo.getCategory()+"");
        //编码
        materialBomHalf.setBomCode(coding);
        //物料id
        materialBomHalf.setMaterialId(materialNewBomAddVo.getMaterialId());
        materialBomHalf.setMaterialName(materialNewBomAddVo.getMaterialName());

        //复制Bom
        materialBomHalf.setBomCopy(materialNewBomAddVo.getBomCopy());

        //物料编码
        materialBomHalf.setMaterialCode(materialNewBomAddVo.getMaterialCode());
        //默认标志
        materialBomHalf.setBomMark(materialNewBomAddVo.getBomMark());
        //父级id默认给0
        materialBomHalf.setBomParentId(0L);
        //创建人
        materialBomHalf.setCreateBy(SecurityUtils.getUsername());
        //部门id
        materialBomHalf.setDeptId(SecurityUtils.getDeptId());


        long count = materialBomHalfMapper.selectCount();
        materialBomHalf.setBomOrderNum(Integer.parseInt(String.valueOf(count + 1)));

        int save = materialBomHalfMapper.insertBom(materialBomHalf);

        List<MaterialNewBomAddListVo> list = materialNewBomAddVo.getList();


        if (save > 0) {
            for (int i = 0; i < list.size(); i++) {

                //判断Bom明细是否是半成品
                //如果是半成品
                if (list.get(i).getBomCode() != null && !"".equals(list.get(i).getBomCode())) {
                    //通过Bom编码查出Bom列表
                    MaterialBomHalfDto materialBomHalfDto = materialBomHalfMapper.getByBomCode(list.get(i).getBomCode());
                    getLower(materialBomHalfDto.getBomId(), materialBomHalf.getBomId(), i + 1, list.get(i).getBomCode());
                    //把半成品添加到明细中，没有占比，添加占比
                    boolean update =  materialBomHalfDetailMapper.updateProportion(list.get(i).getBomCode(),list.get(i).getBomProportion(),list.get(i).getBomProportionStatus(),materialBomHalf.getBomId());
                    if (!update){
                        throw new GlobalException("新增失败");
                    }
                } else {
                    //如果不是半成品
                    //半成品新增
                    MaterialBomHalfDto materialBomHalfDetail = new MaterialBomHalfDto();
                    //物料id
                    materialBomHalfDetail.setMaterialId(list.get(i).getMaterialId());

                    //物料名称
                    materialBomHalfDetail.setMaterialName(list.get(i).getMaterialName());

                    //Bom编码
                    materialBomHalfDetail.setBomCode(list.get(i).getBomCode());

                    //类别
                    materialBomHalfDetail.setBomType(list.get(i).getBomType());
                    //物料编码
                    materialBomHalfDetail.setMaterialCode(list.get(i).getMaterialCode());
                    //占比
                    materialBomHalfDetail.setBomProportion(list.get(i).getBomProportion());
                    //占比计算（开关）
                    materialBomHalfDetail.setBomProportionStatus(list.get(i).getBomProportionStatus());
                    //顺序
                    materialBomHalfDetail.setBomOrderNum(i + 1);
                    //父级id
                    materialBomHalfDetail.setBomParentId(materialBomHalf.getBomId());

                    //创建人
                    materialBomHalfDetail.setCreateBy(SecurityUtils.getUsername());
                    //部门id
                    materialBomHalf.setDeptId(SecurityUtils.getDeptId());

                    materialBomHalfDetailMapper.insertMaterialBomDetail(materialBomHalfDetail);
                }
            }
        } else {
            throw new GlobalException("新增失败");
        }


        return save > 0;
    }

    /**
     * 查看Bom信息
     *
     * @param bomId
     * @return
     */
    @Override
    public MaterialBomHalfViewDto view(long bomId) {
        //通过bomId查出bom信息
        MaterialBomHalfDto materialBomHalfDto = materialBomHalfMapper.getByBomId(bomId);
        //通过物料id查出物料编码，名称，规格，产品类别
        String bomType = materialBomHalfDto.getBomType();

        MaterialBomHalfViewDto materialBomHalfViewDto = new MaterialBomHalfViewDto();

        materialBomHalfViewDto.setCategory(materialBomHalfDto.getBomType());
        materialBomHalfViewDto.setBomMark(materialBomHalfDto.getBomMark() + "");
        materialBomHalfViewDto.setBomCopy(materialBomHalfDto.getBomCopy());
        materialBomHalfViewDto.setBomCode(materialBomHalfDto.getBomCode());
        materialBomHalfViewDto.setBomId(materialBomHalfDto.getBomId());


        //判断类别是成品还是半成品，原料，辅料
        //半成品
        if ("3".equals(bomType)) {

            MaterialHalfVo materialHalf = new MaterialHalfVo();
            MaterialHalfDto materialHalfDto = new MaterialHalfDto();
            materialHalf.setMaterialId(materialBomHalfDto.getMaterialId());
            List<MaterialHalfDto> haList = materialHalfMapper.selectHalfList(materialHalf);
            materialHalfDto = haList.get(0);
            materialBomHalfViewDto.setMaterialCode(materialHalfDto.getMaterialCode());
            materialBomHalfViewDto.setMaterialName(materialHalfDto.getMaterialName());
            materialBomHalfViewDto.setMaterialSpec(materialHalfDto.getMaterialSpec());
            materialBomHalfViewDto.setMaterialTypeName(materialHalfDto.getMaterialCategory());
            materialBomHalfViewDto.setCategory("3");
            materialBomHalfViewDto.setCategoryDict("半成品");
        } else if ("4".equals(bomType)) {
            //成品
            MaterialFinishedVo materialFinished = new MaterialFinishedVo();
            materialFinished.setMaterialId(materialBomHalfDto.getMaterialId());
            List<MaterialFinishedDto> mfDto = materialFinishedMapper.selectFinishedList(materialFinished);
            MaterialFinishedDto materialFinishedDto = mfDto.get(0);
            materialBomHalfViewDto.setMaterialCode(materialFinishedDto.getMaterialCode());
            materialBomHalfViewDto.setMaterialName(materialFinishedDto.getMaterialName());
            materialBomHalfViewDto.setMaterialSpec(materialFinishedDto.getMaterialSpec());
            materialBomHalfViewDto.setMaterialTypeName(materialFinishedDto.getMaterialTypeName());
            materialBomHalfViewDto.setCategory("4");
            materialBomHalfViewDto.setCategoryDict("成品");

        } else if ("1".equals(bomType)) {
            //原料
            MaterialAwmateriaDto materialAwmateriaDto = materialAwmateriaMapper.selectAwmateriaById(materialBomHalfDto.getMaterialId());
            if (materialAwmateriaDto!=null) {
                materialBomHalfViewDto.setMaterialCode(materialAwmateriaDto.getMaterialCode());
                materialBomHalfViewDto.setMaterialName(materialAwmateriaDto.getMaterialName());
                materialBomHalfViewDto.setMaterialSpec(materialAwmateriaDto.getMaterialSpec());
                materialBomHalfViewDto.setMaterialTypeName(materialAwmateriaDto.getMaterialCategory());
                materialBomHalfViewDto.setCategoryDict("原料");
                materialBomHalfViewDto.setCategory("1");
            }
        } else {
            //辅料
            MaterialAccessoriesVo materialAccessories = new MaterialAccessoriesVo();
            materialAccessories.setMaterialId(materialBomHalfDto.getMaterialId());
            List<MaterialAwmateriaDto> maList = materialAccessoriesMapper.selectAccessoriesList(materialAccessories);
            MaterialAwmateriaDto materialAwmateriaDto = maList.get(0);
            materialBomHalfViewDto.setMaterialCode(materialAwmateriaDto.getMaterialCode());
            materialBomHalfViewDto.setMaterialName(materialAwmateriaDto.getMaterialName());
            materialBomHalfViewDto.setMaterialSpec(materialAwmateriaDto.getMaterialSpec());
            materialBomHalfViewDto.setMaterialTypeName(materialAwmateriaDto.getMaterialCategory());
            materialBomHalfViewDto.setCategoryDict("辅料");
            materialBomHalfViewDto.setCategory("2");
        }
        ArrayList<MaterialBomHalfListDto> materialBomHalfListDtoArrayList = new ArrayList<>();

        //通过bomId查出物料明细信息列表
        List<MaterialBomHalfListDto> parentList = materialBomHalfDetailMapper.getByParentIdView(bomId);

        List<SysDictData> netArray = DictUtils.getDictCache("sys_material_unit");
        Map<String, String> netMap = netArray.stream().collect(Collectors.toMap(SysDictData::getDictValue, SysDictData::getDictLabel));

        for (MaterialBomHalfListDto materialBomHalfListDto : parentList) {
            //查出物料编码，物料名称，物料规格
            if ("3".equals(materialBomHalfListDto.getBomType())) {

                MaterialHalfVo materialHalf = new MaterialHalfVo();
                MaterialHalfDto materialHalfDto = new MaterialHalfDto();
                materialHalf.setMaterialId(materialBomHalfListDto.getMaterialId());
                List<MaterialHalfDto> haList = materialHalfMapper.selectHalfList(materialHalf);
                materialHalfDto = haList.get(0);
                materialBomHalfListDto.setMaterialCode(materialHalfDto.getMaterialCode());
                materialBomHalfListDto.setMaterialName(materialHalfDto.getMaterialName());
                materialBomHalfListDto.setMaterialSpec(materialHalfDto.getMaterialSpec());
                materialBomHalfListDto.setMaterialUnit(netMap.get(materialHalfDto.getMaterialUnit()));
                materialBomHalfListDto.setBomTypeDict("半成品");
                materialBomHalfListDto.setBomType("3");

            } else if ("4".equals(materialBomHalfListDto.getBomType())) {
                //成品
                MaterialFinishedVo materialFinished = new MaterialFinishedVo();
                materialFinished.setMaterialId(materialBomHalfListDto.getMaterialId());
                List<MaterialFinishedDto> mfDto = materialFinishedMapper.selectFinishedList(materialFinished);
                MaterialFinishedDto materialFinishedDto = mfDto.get(0);
                materialBomHalfListDto.setMaterialCode(materialFinishedDto.getMaterialCode());
                materialBomHalfListDto.setMaterialName(materialFinishedDto.getMaterialName());
                materialBomHalfListDto.setMaterialSpec(materialFinishedDto.getMaterialSpec());
                materialBomHalfListDto.setMaterialUnit(netMap.get(materialFinishedDto.getMaterialUnit()));
                materialBomHalfListDto.setBomTypeDict("成品");
                materialBomHalfListDto.setBomType("4");

            } else if ("1".equals(materialBomHalfListDto.getBomType())) {
                //原料
                MaterialAwmateriaDto materialAwmateriaDto = materialAwmateriaMapper.selectAwmateriaById(materialBomHalfListDto.getMaterialId());
                materialBomHalfListDto.setMaterialCode(materialAwmateriaDto.getMaterialCode());
                materialBomHalfListDto.setMaterialName(materialAwmateriaDto.getMaterialName());
                materialBomHalfListDto.setMaterialSpec(materialAwmateriaDto.getMaterialSpec());
                materialBomHalfListDto.setMaterialUnit(netMap.get(materialAwmateriaDto.getMaterialUnit()));
                materialBomHalfListDto.setBomTypeDict("原料");
                materialBomHalfListDto.setBomType("1");
            } else {
                //辅料
                MaterialAccessoriesVo materialAccessories = new MaterialAccessoriesVo();
                materialAccessories.setMaterialId(materialBomHalfListDto.getMaterialId());
                List<MaterialAwmateriaDto> maList = materialAccessoriesMapper.selectAccessoriesList(materialAccessories);
                MaterialAwmateriaDto materialAwmateriaDto = maList.get(0);
                materialBomHalfListDto.setMaterialCode(materialAwmateriaDto.getMaterialCode());
                materialBomHalfListDto.setMaterialName(materialAwmateriaDto.getMaterialName());
                materialBomHalfListDto.setMaterialSpec(materialAwmateriaDto.getMaterialSpec());
                materialBomHalfListDto.setMaterialUnit(netMap.get(materialAwmateriaDto.getMaterialUnit()));
                materialBomHalfListDto.setBomTypeDict("辅料");
                materialBomHalfListDto.setBomType("2");
            }

            materialBomHalfListDtoArrayList.add(materialBomHalfListDto);
        }

        materialBomHalfViewDto.setList(materialBomHalfListDtoArrayList);

        return materialBomHalfViewDto;
    }

    /**
     * 删除Bom信息
     *
     * @param bomId
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean deleteMaterialBomById(long bomId) {

        //查询当前Bom编码是否在明细中，如果有则提示该半成品已经被引用，不能删除
       List<MaterialBomHalfDetailDto> list  = materialBomHalfDetailMapper.getBomCode(bomId);

       if (list.size()>0){
           throw new GlobalException("该半成品BOM已被其他BOM引用");
       }

        //删除Bom信息主表
        int removeBom = materialBomHalfMapper.removeBom(bomId);

        if (removeBom > 0) {
            recursiveDelete(bomId);
        } else {
            throw new GlobalException("删除失败");
        }

        return removeBom > 0;
    }

    /**
     * 修改Bom信息
     *
     * @param materialNewBomAddVo
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean updateMaterialBomEdit(MaterialNewBomAddVo materialNewBomAddVo) {

        MaterialBomHalfDto materialBomHalf = materialBomHalfMapper.getByBomId(materialNewBomAddVo.getBomId());
        //修改产品编码,产品id,复制Bom

        MaterialBomHalf materialBomHalf1 = new MaterialBomHalf();
        materialBomHalf1.setMaterialCode(materialNewBomAddVo.getMaterialCode());
        materialBomHalf1.setMaterialName(materialNewBomAddVo.getMaterialName());
        materialBomHalf1.setMaterialId(materialNewBomAddVo.getMaterialId());
        materialBomHalf1.setBomMark(materialNewBomAddVo.getBomMark());
        materialBomHalf1.setBomCopy(materialNewBomAddVo.getBomCopy());
        materialBomHalf1.setBomId(materialBomHalf.getBomId());


        boolean update = materialBomHalfMapper.updateBom(materialBomHalf1);

        if (update) {
            //正常修改，先删再增加
            boolean b = recursiveDelete(materialNewBomAddVo.getBomId());
            List<MaterialNewBomAddListVo> list = materialNewBomAddVo.getList();


            //查询当前bom的物料编码是否只有一个默认
            long Markcount = materialBomHalfMapper.selectDefault(materialNewBomAddVo.getMaterialCode());
            //如果大于等于1，那么如果vo中的默认标识为1，则提示一个成品，半成品只存在一条BOM
            if (Markcount>=1 && materialNewBomAddVo.getBomMark()==1){
                throw new GlobalException("一个成品,半成品只能存在一条默认BOM");
            }

            //新增判断明细是否相同校验

            //通过产品编码查出是否存在此bom
            MaterialBomHalf materialBomHalf11 = new MaterialBomHalf();
            materialBomHalf1.setMaterialCode(materialNewBomAddVo.getMaterialCode());
            List<MaterialBomHalfDto> materialBomHalfDtos = materialBomHalfMapper.selectCopyBomList(materialBomHalf11);

            //如果存在该物料编码的BOM则触发校验
            if (materialBomHalfDtos.size()>0){

                for (MaterialBomHalfDto materialBomHalfDto : materialBomHalfDtos) {

                    //二级列表
                    List<MaterialBomHalfDetailDto> twoList = materialBomHalfDetailMapper.getByParentId(materialBomHalfDto.getBomId());

                    if (twoList.size()==materialNewBomAddVo.getList().size()) {

                        int count =0;

                        for (MaterialBomHalfDetailDto materialBomHalfDetailDto : twoList) {

                            //新增明细集合
                            for (MaterialNewBomAddListVo materialNewBomAddListVo : materialNewBomAddVo.getList()) {
                                if (materialBomHalfDetailDto.getMaterialCode().equals(materialNewBomAddListVo.getMaterialCode()) && materialBomHalfDetailDto.getBomProportion().equals(materialNewBomAddListVo.getBomProportion())) {
                                    count++;
                                }
                            }

                        }

                        if (count==materialNewBomAddVo.getList().size()){
                            throw new GlobalException("系统BOM已经存在");
                        }
                    }

                }


            }


            for (int i = 0; i < list.size(); i++) {

                //判断Bom明细是否是半成品
                //如果是半成品
                if (list.get(i).getBomCode() != null && !"".equals(list.get(i).getBomCode())) {
                    //通过Bom编码查出Bom列表
                    MaterialBomHalfDto materialBomHalfDto = materialBomHalfMapper.getByBomCode(list.get(i).getBomCode());
                    getLower(materialBomHalfDto.getBomId(), materialBomHalf.getBomId(), i + 1, list.get(i).getBomCode());
                } else {
                    //如果不是半成品
                    //半成品新增
                    MaterialBomHalfDto materialBomHalfDetail = new MaterialBomHalfDto();
                    //物料id
                    materialBomHalfDetail.setMaterialId(list.get(i).getMaterialId());
                    //类别
                    materialBomHalfDetail.setBomType(list.get(i).getBomType());

                    //物料名称
                    materialBomHalfDetail.setMaterialName(list.get(i).getMaterialName());

                    //物料编码
                    materialBomHalfDetail.setMaterialCode(list.get(i).getMaterialCode());
                    //占比
                    materialBomHalfDetail.setBomProportion(list.get(i).getBomProportion());
                    //占比计算（开关）
                    materialBomHalfDetail.setBomProportionStatus(list.get(i).getBomProportionStatus());
                    //顺序
                    materialBomHalfDetail.setBomOrderNum(i + 1);
                    //父级id
                    materialBomHalfDetail.setBomParentId(materialBomHalf.getBomId());

                    //创建人
                    materialBomHalfDetail.setCreateBy(SecurityUtils.getUsername());
                    //部门id
                    materialBomHalf.setDeptId(SecurityUtils.getDeptId());

                    materialBomHalfDetailMapper.insertMaterialBomDetail(materialBomHalfDetail);
                }
            }

            //通过bom编码查出明细表中所有被引用的半成品
            List<MaterialBomHalfDetailDto> materialBomHalfDetailDtoList = materialBomHalfDetailMapper.selectBomCode(materialNewBomAddVo.getBomCode());


            for (MaterialBomHalfDetailDto materialBomHalfDetailDto : materialBomHalfDetailDtoList) {
                //删除bom引用
                boolean remove = recursiveDelete(materialBomHalfDetailDto.getBomId());

                //新增Bom引用
                getLower(materialBomHalf.getBomId(), materialBomHalfDetailDto.getBomParentId(), materialBomHalfDetailDto.getBomOrderNum(), materialNewBomAddVo.getBomCode());
            }
        } else {
            throw new GlobalException("修改失败");
        }

        return update;
    }

    /**
     * 获取bom第一层级数据列表（委外订单新增使用）
     *
     * @param materialBomVo
     * @return
     */
    @Override
    public List<MaterialBomHalfDto> getOneLevelList(MaterialBomVo materialBomVo) {

        List<MaterialBomHalfDto> list = materialBomHalfMapper.getOneLevelList(materialBomVo);

        for (MaterialBomHalfDto entity : list) {

            //单位字典
            List<SysDictData> netArray = DictUtils.getDictCache("sys_material_unit");
            Map<String, String> netMap = netArray.stream().collect(Collectors.toMap(SysDictData::getDictValue, SysDictData::getDictLabel));

            //半成品
            if ("3".equals(entity.getBomType())) {
                MaterialHalfVo materialHalfVo = new MaterialHalfVo();
                materialHalfVo.setMaterialId(entity.getMaterialId());
                List<MaterialHalfDto> haList = materialHalfMapper.selectHalfList(materialHalfVo);
                MaterialHalfDto materialHalfDto = haList.get(0);
                entity.setMaterialCode(materialHalfDto.getMaterialCode());
                entity.setMaterialName(materialHalfDto.getMaterialName());
                entity.setMaterialSpec(materialHalfDto.getMaterialSpec());
                entity.setMaterialTypeName(materialHalfDto.getMaterialCategory());
                entity.setMaterialUnit(netMap.get(materialHalfDto.getMaterialUnit()));
            }
            //成品
            if ("4".equals(entity.getBomType())) {
                MaterialFinishedVo materialFinished = new MaterialFinishedVo();
                materialFinished.setMaterialId(entity.getMaterialId());
                List<MaterialFinishedDto> mfDto = materialFinishedMapper.selectFinishedList(materialFinished);
                MaterialFinishedDto materialFinishedDto = mfDto.get(0);
                entity.setMaterialCode(materialFinishedDto.getMaterialCode());
                entity.setMaterialName(materialFinishedDto.getMaterialName());
                entity.setMaterialSpec(materialFinishedDto.getMaterialSpec());
                entity.setMaterialTypeName(materialFinishedDto.getMaterialTypeName());
                entity.setMaterialUnit(netMap.get(materialFinishedDto.getMaterialUnit()));
            }
        }
        return list;
    }

    /**
     *  获取BOM信息(库存量)
     * @param bomId
     * @return
     */
    @Override
    public List<MaterialBomHalfDetailDto> selectlBomDetailListInventory(long bomId) {

        return infoBomDetailSharing(bomId);
    }

    @Override
    public List<MaterialBomHalfDetailDto> selectlBomDetailListInventoryTz(long bomId) {
        return infoBomDetailSharingTz(bomId);
    }

    /**
     * 复制Bom列表
     * @param materialBomHalf
     * @return
     */
    @Override
    public List<MaterialBomHalfDto> copyBomList(MaterialBomHalf materialBomHalf) {
        List<MaterialBomHalfDto> list =  materialBomHalfMapper.selectCopyBomList(materialBomHalf);

        //单位字典
        List<SysDictData> netArray = DictUtils.getDictCache("sys_material_unit");
        Map<String, String> netMap = netArray.stream().collect(Collectors.toMap(SysDictData::getDictValue, SysDictData::getDictLabel));

        for (MaterialBomHalfDto entity : list) {
            //半成品
            if ("3".equals(entity.getBomType())) {
                MaterialHalfVo materialHalfVo = new MaterialHalfVo();
                materialHalfVo.setMaterialId(entity.getMaterialId());
                List<MaterialHalfDto> haList = materialHalfMapper.selectHalfList(materialHalfVo);
                MaterialHalfDto materialHalfDto = haList.get(0);
                entity.setMaterialCode(materialHalfDto.getMaterialCode());
                entity.setMaterialName(materialHalfDto.getMaterialName());
                entity.setMaterialSpec(materialHalfDto.getMaterialSpec());
                entity.setMaterialTypeName(materialHalfDto.getMaterialCategory());
                entity.setMaterialUnit(netMap.get(materialHalfDto.getMaterialUnit()));
                entity.setBomType("半成品");
            }
            //成品
            if ("4".equals(entity.getBomType())) {
                MaterialFinishedVo materialFinished = new MaterialFinishedVo();
                materialFinished.setMaterialId(entity.getMaterialId());
                List<MaterialFinishedDto> mfDto = materialFinishedMapper.selectFinishedList(materialFinished);
                MaterialFinishedDto materialFinishedDto = mfDto.get(0);
                entity.setMaterialCode(materialFinishedDto.getMaterialCode());
                entity.setMaterialName(materialFinishedDto.getMaterialName());
                entity.setMaterialSpec(materialFinishedDto.getMaterialSpec());
                entity.setMaterialTypeName(materialFinishedDto.getMaterialTypeName());
                entity.setMaterialUnit(netMap.get(materialFinishedDto.getMaterialUnit()));
                entity.setBomType("成品");
            }
        }

        return list;
    }

    /**
     * BOM树结构列表
     * @param materialBomHalf
     * @return
     */
    @Override
    public List<MaterialBomHalfDto> BomList(MaterialBomHalf materialBomHalf) {
        //查询第一级BOM列表
        List<MaterialBomHalfDto> list =  materialBomHalfMapper.selectCopyBomList(materialBomHalf);

        for (MaterialBomHalfDto materialBomHalfDto : list) {
            List<MaterialBomHalfDetailDto> treeBom = getTreeBom(materialBomHalfDto);
            materialBomHalfDto.setChildren(treeBom);
        }

        for (MaterialBomHalfDto materialBomDto : list) {

            String bomType = materialBomDto.getBomType();

            List<SysDictData> netArray = DictUtils.getDictCache("sys_material_unit");
            Map<String, String> netMap = netArray.stream().collect(Collectors.toMap(SysDictData::getDictValue, SysDictData::getDictLabel));

            //半成品
            if ("3".equals(bomType)) {

                MaterialHalfVo materialHalf = new MaterialHalfVo();
                MaterialHalfDto materialHalfDto = new MaterialHalfDto();
                materialHalf.setMaterialId(materialBomDto.getMaterialId());
                List<MaterialHalfDto> haList = materialHalfMapper.selectHalfList(materialHalf);
                materialHalfDto = haList.get(0);
                materialBomDto.setMaterialCode(materialHalfDto.getMaterialCode());
                materialBomDto.setMaterialName(materialHalfDto.getMaterialName());
                materialBomDto.setMaterialSpec(materialHalfDto.getMaterialSpec());
                materialBomDto.setMaterialTypeName(materialHalfDto.getMaterialCategory());
                materialBomDto.setMaterialUnit(netMap.get(materialHalfDto.getMaterialUnit()));
                materialBomDto.setBomType("半成品");
            } else if ("4".equals(bomType)) {
                //成品
                MaterialFinishedVo materialFinished = new MaterialFinishedVo();
                materialFinished.setMaterialId(materialBomDto.getMaterialId());
                List<MaterialFinishedDto> mfDto = materialFinishedMapper.selectFinishedList(materialFinished);
                MaterialFinishedDto materialFinishedDto = mfDto.get(0);
                materialBomDto.setMaterialCode(materialFinishedDto.getMaterialCode());
                materialBomDto.setMaterialName(materialFinishedDto.getMaterialName());
                materialBomDto.setMaterialSpec(materialFinishedDto.getMaterialSpec());
                materialBomDto.setMaterialTypeName(materialFinishedDto.getMaterialTypeName());
                materialBomDto.setMaterialUnit(netMap.get(materialFinishedDto.getMaterialUnit()));
                materialBomDto.setBomType("成品");
            } else if ("1".equals(bomType)) {
                //原料
                MaterialAwmateriaDto materialAwmateriaDto = materialAwmateriaMapper.selectAwmateriaById(materialBomDto.getMaterialId());

                if (materialAwmateriaDto!=null) {

                    materialBomDto.setMaterialCode(materialAwmateriaDto.getMaterialCode());
                    materialBomDto.setMaterialName(materialAwmateriaDto.getMaterialName());
                    materialBomDto.setMaterialSpec(materialAwmateriaDto.getMaterialSpec());
                    materialBomDto.setMaterialTypeName(materialAwmateriaDto.getMaterialCategory());
                    materialBomDto.setMaterialUnit(netMap.get(materialAwmateriaDto.getMaterialUnit()));
                    materialBomDto.setBomType("原料");
                }
            } else {
                //辅料
                MaterialAccessoriesVo materialAccessories = new MaterialAccessoriesVo();
                materialAccessories.setMaterialId(materialBomDto.getMaterialId());
                List<MaterialAwmateriaDto> maList = materialAccessoriesMapper.selectAccessoriesList(materialAccessories);
                MaterialAwmateriaDto materialAwmateriaDto = maList.get(0);
                materialBomDto.setMaterialCode(materialAwmateriaDto.getMaterialCode());
                materialBomDto.setMaterialName(materialAwmateriaDto.getMaterialName());
                materialBomDto.setMaterialSpec(materialAwmateriaDto.getMaterialSpec());
                materialBomDto.setMaterialTypeName(materialAwmateriaDto.getMaterialCategory());
                materialBomDto.setMaterialUnit(netMap.get(materialAwmateriaDto.getMaterialUnit()));
                materialBomDto.setBomType("辅料");
            }
        }

        return list;
    }


    /**
     * 递归查询下级列表
     */
    public List<MaterialBomHalfDetailDto> getTreeBom(MaterialBomHalfDto materialBomHalfDto){
        //查询下级Bom列表
        List<MaterialBomHalfDetailDto> parentId = materialBomHalfDetailMapper.getByParentId(materialBomHalfDto.getBomId());

        List<SysDictData> netArray = DictUtils.getDictCache("sys_material_unit");
        Map<String, String> netMap = netArray.stream().collect(Collectors.toMap(SysDictData::getDictValue, SysDictData::getDictLabel));

        if (parentId.size() == 0){
            List<MaterialBomHalfDetailDto> list =new ArrayList<>();
            materialBomHalfDto.setChildren(list);
        }

        if (parentId.size() != 0){

            materialBomHalfDto.setChildren(parentId);

            for (MaterialBomHalfDetailDto materialBomHalfDetailDto : parentId) {

                String bomType = materialBomHalfDetailDto.getBomType();

                //半成品
                if ("3".equals(bomType)) {

                    MaterialHalfVo materialHalf = new MaterialHalfVo();
                    MaterialHalfDto materialHalfDto = new MaterialHalfDto();
                    materialHalf.setMaterialId(materialBomHalfDetailDto.getMaterialId());
                    List<MaterialHalfDto> haList = materialHalfMapper.selectHalfList(materialHalf);
                    materialHalfDto = haList.get(0);
                    materialBomHalfDetailDto.setMaterialCode(materialHalfDto.getMaterialCode());
                    materialBomHalfDetailDto.setMaterialName(materialHalfDto.getMaterialName());
                    materialBomHalfDetailDto.setMaterialSpec(materialHalfDto.getMaterialSpec());
                    materialBomHalfDetailDto.setMaterialTypeName(materialHalfDto.getMaterialCategory());
                    materialBomHalfDetailDto.setMaterialUnit(netMap.get(materialHalfDto.getMaterialUnit()));
                    materialBomHalfDetailDto.setBomType("半成品");
                } else if ("4".equals(bomType)) {
                    //成品
                    MaterialFinishedVo materialFinished = new MaterialFinishedVo();
                    materialFinished.setMaterialId(materialBomHalfDetailDto.getMaterialId());
                    List<MaterialFinishedDto> mfDto = materialFinishedMapper.selectFinishedList(materialFinished);
                    MaterialFinishedDto materialFinishedDto = mfDto.get(0);
                    materialBomHalfDetailDto.setMaterialCode(materialFinishedDto.getMaterialCode());
                    materialBomHalfDetailDto.setMaterialName(materialFinishedDto.getMaterialName());
                    materialBomHalfDetailDto.setMaterialSpec(materialFinishedDto.getMaterialSpec());
                    materialBomHalfDetailDto.setMaterialTypeName(materialFinishedDto.getMaterialTypeName());
                    materialBomHalfDetailDto.setMaterialUnit(netMap.get(materialFinishedDto.getMaterialUnit()));
                    materialBomHalfDetailDto.setBomType("成品");
                } else if ("1".equals(bomType)) {
                    //原料
                    MaterialAwmateriaDto materialAwmateriaDto = materialAwmateriaMapper.selectAwmateriaById(materialBomHalfDetailDto.getMaterialId());

                    if (materialAwmateriaDto!=null) {

                        materialBomHalfDetailDto.setMaterialCode(materialAwmateriaDto.getMaterialCode());
                        materialBomHalfDetailDto.setMaterialName(materialAwmateriaDto.getMaterialName());
                        materialBomHalfDetailDto.setMaterialSpec(materialAwmateriaDto.getMaterialSpec());
                        materialBomHalfDetailDto.setMaterialTypeName(materialAwmateriaDto.getMaterialCategory());
                        materialBomHalfDetailDto.setMaterialUnit(netMap.get(materialAwmateriaDto.getMaterialUnit()));
                        materialBomHalfDetailDto.setBomType("原料");
                    }
                } else {
                    //辅料
                    MaterialAccessoriesVo materialAccessories = new MaterialAccessoriesVo();
                    materialAccessories.setMaterialId(materialBomHalfDetailDto.getMaterialId());
                    List<MaterialAwmateriaDto> maList = materialAccessoriesMapper.selectAccessoriesList(materialAccessories);
                    MaterialAwmateriaDto materialAwmateriaDto = maList.get(0);
                    materialBomHalfDetailDto.setMaterialCode(materialAwmateriaDto.getMaterialCode());
                    materialBomHalfDetailDto.setMaterialName(materialAwmateriaDto.getMaterialName());
                    materialBomHalfDetailDto.setMaterialSpec(materialAwmateriaDto.getMaterialSpec());
                    materialBomHalfDetailDto.setMaterialTypeName(materialAwmateriaDto.getMaterialTypeName());
                    materialBomHalfDetailDto.setMaterialUnit(netMap.get(materialAwmateriaDto.getMaterialUnit()));
                    materialBomHalfDetailDto.setBomType("辅料");
                }

                    MaterialBomHalfDto materialBomHalfDto1 = new MaterialBomHalfDto();
                    BeanUtils.copyProperties(materialBomHalfDetailDto,materialBomHalfDto1);

                List<MaterialBomHalfDetailDto> treeBom = getTreeBom(materialBomHalfDto1);
                materialBomHalfDetailDto.setChildren(treeBom);
            }

            //materialBomHalfDto.setChildren(parentId);


        }

        return parentId;

    }


    /**
     *  根据编码获取半成品bom信息(fegin调用)
     * @param materialCode
     * @return
     */
    @Override
    public List<BomDetailListDto> getHalfData(String materialCode) {
        Long bomId = materialBomHalfMapper.getBomIdByMaterialCode(materialCode);
        //根据bomid获取对应的物料
        return materialBomHalfDetailMapper.selectBomDetailListTZ(bomId);
    }

    /**
     * @param :bomId:明细最上层id 递归删除Bom明细
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public boolean recursiveDelete(long bomId) {

        //查询我当前下层还有没有数据
        //查出下层的明细信息
        List<MaterialBomHalfDetailDto> list = materialBomHalfDetailMapper.getByParentId(bomId);
        //如果无直接返回true
        if (list.isEmpty()) {
            return true;
        }
        //删除上层id是传来的bomid的bom明细信息
        int remove = materialBomHalfDetailMapper.removeBomDetail(bomId);

        if (remove > 0) {

            //如果不存在下层则结束递归
            if (!list.isEmpty()) {
                for (MaterialBomHalfDetailDto materialBomHalfDetailDto : list) {
                    recursiveDelete(materialBomHalfDetailDto.getBomId());
                }
            }
        } else {
            throw new GlobalException("删除失败");
        }


        return remove > 0;
    }


    /**
     * bomId:明细所选半成品BomId,BomParentId:父级id，sort：顺序，code：所选半成品编码
     * 递归查询半成品的下级物料
     */
    @Transactional(rollbackFor = Exception.class)
    public void getLower(Long bomId, Long BomParentId, int sort, String code) {

        //查出父级id是新增半成品或者成品的物料
        MaterialBomHalfDetailDto materialBomHalfDetailDto = materialBomHalfDetailMapper.getByParentIdAndCode(BomParentId, code);

        Long id = 0L;

        if (materialBomHalfDetailDto == null) {
            //通过bomId查出明细表中的半成品信息
            MaterialBomHalfDto materialBomHalfDto = materialBomHalfMapper.getByBomId(bomId);

            materialBomHalfDto.setBomParentId(BomParentId);
            materialBomHalfDto.setBomOrderNum(sort);

            //添加半成品
            int save = materialBomHalfDetailMapper.insertMaterialBomDetail(materialBomHalfDto);

            if (save < 0) {
                throw new GlobalException("新增失败");
            }

            //获取当前半成品的id
            id = materialBomHalfDto.getBomId();
        } else {
            id = materialBomHalfDetailDto.getBomId();
        }


        //通过Bomid查出下级的物料信息
        List<MaterialBomHalfDetailDto> halfDetailDtoList = materialBomHalfDetailMapper.getByParentId(bomId);

        for (int i = 0; i < halfDetailDtoList.size(); i++) {
            if (halfDetailDtoList.get(i).getBomCode() == null || "".equals(halfDetailDtoList.get(i).getBomCode())) {
                //如果不是半成品
                //通过bomId查出明细表中的半成品信息
                MaterialBomHalfDetailDto materialBomHalfDetailDto11 = materialBomHalfDetailMapper.getDetail(halfDetailDtoList.get(i).getBomId());

                materialBomHalfDetailDto11.setBomParentId(id);

                MaterialBomHalfDto materialBomHalf = new MaterialBomHalfDto();

                //添加非半成品
                BeanUtils.copyProperties(materialBomHalfDetailDto11, materialBomHalf);
                int saveBc = materialBomHalfDetailMapper.insertMaterialBomDetail(materialBomHalf);

                if (saveBc < 0) {
                    throw new GlobalException("新增失败");
                }

            } else {
                //通过Bom编码查出Bom列表
                MaterialBomHalfDto materialBomHalfDto = materialBomHalfMapper.getByBomCode(halfDetailDtoList.get(i).getBomCode());
                getLower(materialBomHalfDto.getBomId(), id, i + 1, halfDetailDtoList.get(i).getBomCode());
            }
        }

    }

    /**
     * 共用BOM信息查询
     *
     * @param bomId bomId
     * @return List<MaterialBomDetail>
     */
    public List<MaterialBomHalfDetailDto> infoBomDetailSharing (long bomId) {

        //单位字典
        List<SysDictData> dictList= DictUtils.getDictCache("sys_material_unit");
        Map<String, String> actualMap = dictList.stream().collect(Collectors.toMap(SysDictData::getDictValue, SysDictData::getDictLabel));

        List<MaterialBomHalfDetailDto> list = materialBomHalfDetailMapper.selectlBomDetailList(bomId);

        for (MaterialBomHalfDetailDto bomDetail : list) {
            int ui = Integer.parseInt(bomDetail.getBomType());
            long maId = bomDetail.getMaterialId();
            switch (ui) {
                //代表原料
                case 1:
                    MaterialAwmateriaDto materialAwmateriaDto = materialAwmateriaMapper.selectAwmateriaById(maId);
                    bomDetail.setMaterialCode(materialAwmateriaDto.getMaterialCode());
                    bomDetail.setMaterialName(materialAwmateriaDto.getMaterialName());
                    bomDetail.setMaterialSpec(materialAwmateriaDto.getMaterialSpec());
                    bomDetail.setMaterialUnit(materialAwmateriaDto.getMaterialUnit());
                    bomDetail.setMaterialUnitDict(actualMap.get(materialAwmateriaDto.getMaterialUnit()));
                    bomDetail.setMaterialType("1");
                    bomDetail.setMaterialTypeDict("原料");
                    bomDetail.setMaterialCategory(materialAwmateriaDto.getMaterialType());
                    bomDetail.setMaterialCategoryDict(materialAwmateriaDto.getMaterialCategory());
                    break;
                //代表半成品
                case 3:
                    MaterialHalfVo materiaHalf = new MaterialHalfVo();
                    MaterialHalfDto materialHalfDto = new MaterialHalfDto();
                    materiaHalf.setMaterialId(maId);
                    List<MaterialHalfDto> haList = materialHalfMapper.selectHalfList(materiaHalf);
                    materialHalfDto = haList.get(0);
                    bomDetail.setMaterialCode(materialHalfDto.getMaterialCode());
                    bomDetail.setMaterialName(materialHalfDto.getMaterialName());
                    bomDetail.setMaterialSpec(materialHalfDto.getMaterialSpec());
                    bomDetail.setMaterialUnit(materialHalfDto.getMaterialUnit());
                    bomDetail.setMaterialUnitDict(actualMap.get(materialHalfDto.getMaterialUnit()));
                    bomDetail.setMaterialType("3");
                    bomDetail.setMaterialTypeDict("半成品");
                    bomDetail.setMaterialCategory(materialHalfDto.getMaterialType());
                    bomDetail.setMaterialCategoryDict(materialHalfDto.getMaterialCategory());
                    break;
                //代表辅料
                case 2:
                    MaterialAccessoriesVo materialAccessories = new MaterialAccessoriesVo();
                    materialAccessories.setMaterialId(maId);
                    List<MaterialAwmateriaDto> list3 = materialAccessoriesMapper.selectAccessoriesList(materialAccessories);
                    MaterialAwmateriaDto material = new MaterialAwmateriaDto();
                    material = list3.get(0);
                    bomDetail.setMaterialCode(material.getMaterialCode());
                    bomDetail.setMaterialName(material.getMaterialName());
                    bomDetail.setMaterialSpec(material.getMaterialSpec());
                    bomDetail.setMaterialUnit(material.getMaterialUnit());
                    bomDetail.setMaterialUnitDict(actualMap.get(material.getMaterialUnit()));
                    bomDetail.setMaterialType("2");
                    bomDetail.setMaterialTypeDict("辅料");
                    bomDetail.setMaterialCategory(material.getMaterialType());
                    bomDetail.setMaterialCategoryDict(material.getMaterialTypeName());
                    break;
                default:
                    break;
            }
        }
        return list;
    }

    /**
     * 共用BOM信息查询(脱脂查询使用)
     *
     * @param bomId bomId
     * @return List<MaterialBomDetail>
     */
    public List<MaterialBomHalfDetailDto> infoBomDetailSharingTz (long bomId) {

        //单位字典
        List<SysDictData> dictList= DictUtils.getDictCache("sys_material_unit");
        Map<String, String> actualMap = dictList.stream().collect(Collectors.toMap(SysDictData::getDictValue, SysDictData::getDictLabel));

        List<MaterialBomHalfDetailDto> list = materialBomHalfDetailMapper.selectlBomDetailList(bomId);

        for (MaterialBomHalfDetailDto bomDetail : list) {
            int ui = Integer.parseInt(bomDetail.getBomType());
            long maId = bomDetail.getMaterialId();
            switch (ui) {
                //代表原料
                case 1:
                    MaterialAwmateriaDto materialAwmateriaDto = materialAwmateriaMapper.selectAwmateriaById(maId);
                    bomDetail.setMaterialCode(materialAwmateriaDto.getMaterialCode());
                    bomDetail.setMaterialName(materialAwmateriaDto.getMaterialName());
                    bomDetail.setMaterialSpec(materialAwmateriaDto.getMaterialSpec());
                    bomDetail.setMaterialUnit(materialAwmateriaDto.getMaterialUnit());
                    bomDetail.setMaterialUnitDict(actualMap.get(materialAwmateriaDto.getMaterialUnit()));
                    bomDetail.setMaterialType("1");
                    bomDetail.setMaterialTypeDict("原料");
                    bomDetail.setMaterialCategory(materialAwmateriaDto.getMaterialType());
                    bomDetail.setMaterialCategoryDict(materialAwmateriaDto.getMaterialCategory());
                    break;
                //代表半成品
                case 3:
                    MaterialHalfVo materiaHalf = new MaterialHalfVo();
                    MaterialHalfDto materialHalfDto = new MaterialHalfDto();
                    materiaHalf.setMaterialId(maId);
                    List<MaterialHalfDto> haList = materialHalfMapper.selectHalfList(materiaHalf);
                    materialHalfDto = haList.get(0);
                    bomDetail.setMaterialCode(materialHalfDto.getMaterialCode());
                    bomDetail.setMaterialName(materialHalfDto.getMaterialName());
                    bomDetail.setMaterialSpec(materialHalfDto.getMaterialSpec());
                    bomDetail.setMaterialUnit(materialHalfDto.getMaterialUnit());
                    bomDetail.setMaterialUnitDict(actualMap.get(materialHalfDto.getMaterialUnit()));
                    bomDetail.setMaterialType("3");
                    bomDetail.setMaterialTypeDict("半成品");
                    bomDetail.setMaterialCategory(materialHalfDto.getMaterialType());
                    bomDetail.setMaterialCategoryDict(materialHalfDto.getMaterialCategory());
                    break;
                //代表辅料
                case 2:
                    MaterialAccessoriesVo materialAccessories = new MaterialAccessoriesVo();
                    materialAccessories.setMaterialId(maId);
                    List<MaterialAwmateriaDto> list3 = materialAccessoriesMapper.selectAccessoriesList(materialAccessories);
                    MaterialAwmateriaDto material = new MaterialAwmateriaDto();
                    material = list3.get(0);
                    bomDetail.setMaterialCode(material.getMaterialCode());
                    bomDetail.setMaterialName(material.getMaterialName());
                    bomDetail.setMaterialSpec(material.getMaterialSpec());
                    bomDetail.setMaterialUnit(material.getMaterialUnit());
                    bomDetail.setMaterialUnitDict(actualMap.get(material.getMaterialUnit()));
                    bomDetail.setMaterialType("2");
                    bomDetail.setMaterialTypeDict("辅料");
                    bomDetail.setMaterialCategory(material.getMaterialType());
                    bomDetail.setMaterialCategoryDict(material.getMaterialTypeName());
                    break;
                default:
                    break;
            }
        }
        return list;
    }


}
